home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cocktail
/
cg.lha
/
cg
/
src
/
Optimize.mi
< prev
next >
Wrap
Text File
|
1992-11-24
|
7KB
|
340 lines
IMPLEMENTATION MODULE Optimize;
IMPORT SYSTEM, System, IO, Tree;
(* line 20 "" *)
FROM SYSTEM IMPORT TSIZE;
FROM General IMPORT Max;
FROM DynArray IMPORT MakeArray, ReleaseArray;
FROM IO IMPORT StdOutput, WriteI, WriteS, WriteNl;
FROM Idents IMPORT WriteIdent;
FROM Sets IMPORT
tSet , IsElement , AssignElmt , Union ,
Assign , Minimum , Maximum , Include ;
FROM Relations IMPORT
IsRelated ;
FROM Tree IMPORT
NoTree , tTree , tInstance ,
Computed , Reverse , Write , Read ,
Inherited , Synthesized , Input , Output ,
Stack , Parameter , Variable ,
CopyDef , CopyUse , Thread , Test ,
Left , Right , Def , Use ,
ChildUse , ParentUse , NonBaseComp , First ,
Dummy , Virtual , Demand , f ,
WriteName , Options , ForallClasses , ForallAttributes;
FROM Order IMPORT WriteOrderEval, IndexToClass;
TYPE tLife = RECORD Birth, Death: SHORTCARD; END;
VAR
Children ,
Parents ,
Relevant : tSet;
ClassIndex ,
MaxChildUse ,
MaxParentUse ,
Attr ,
Comp ,
Last ,
ChildsVisit ,
i, i2, j, j2, k, Visit, v : SHORTCARD;
ActChild ,
ActClass ,
ChildsClass : tTree;
LifeSize : LONGINT;
LifePtr : POINTER TO ARRAY [0 .. 10000] OF tLife;
PROCEDURE yyAbort (yyFunction: ARRAY OF CHAR);
BEGIN
IO.WriteS (IO.StdError, 'Error: module Optimize, routine ');
IO.WriteS (IO.StdError, yyFunction);
IO.WriteS (IO.StdError, ' failed');
IO.WriteNl (IO.StdError);
Exit;
END yyAbort;
PROCEDURE yyIsEqual (yya, yyb: ARRAY OF SYSTEM.BYTE): BOOLEAN;
VAR yyi : INTEGER;
BEGIN
FOR yyi := 0 TO INTEGER (HIGH (yya)) DO
IF yya [yyi] # yyb [yyi] THEN RETURN FALSE; END;
END;
RETURN TRUE;
END yyIsEqual;
PROCEDURE LifeTime1 (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 71 "" *)
WITH t^.Class DO
(* line 71 "" *)
LifeSize := InstCount + 1;
MakeArray (LifePtr, LifeSize, TSIZE (tLife));
FOR i := 1 TO InstCount DO
LifePtr^ [i].Birth := 0;
LifePtr^ [i].Death := 0;
END;
Visit := 1;
FOR i := 1 TO InstCount DO
i2 := Instance^ [i].Order;
WITH Instance^ [i2] DO
IF {Left, Inherited, First} <= Properties THEN
Visit := Attribute^.Child.Partition;
END;
IF {Left, Synthesized} <= Properties THEN
LifePtr^ [i2].Birth := Visit;
INCL (Attribute^.Child.Usage, Visit);
END;
IF Right IN Properties THEN
LifePtr^ [i2].Birth := Visit;
END;
IF ({Left, Synthesized, First} <= Properties) AND NOT (Dummy IN Properties) OR
({Right, Inherited, First} <= Properties) THEN
FOR j := 1 TO AttrCount DO
IF IsRelated (i2, j, DP) THEN
LifePtr^ [j].Death := Visit;
INCL (Instance^ [j].Attribute^.Child.Usage, Visit);
END;
END;
FOR j := AttrCount + 1 TO InstCount DO
IF IsRelated (i2, j, DP) THEN
LifePtr^ [j].Death := Visit;
END;
END;
END;
IF {Right, Synthesized, First} <= Properties THEN
ActClass := t;
ActChild := Selector;
ChildsClass := Selector^.Child.Class;
ChildsVisit := Attribute^.Child.Partition;
LifeTime2 (ChildsClass);
ForallClasses (ChildsClass^.Class.Extensions, LifeTime2);
END;
END;
END;
FOR i := 1 TO AttrCount DO
WITH Instance^ [i] DO
IF (Synthesized IN Properties) AND (LifePtr^ [i].Birth < LifePtr^ [i].Death) THEN
INCL (Attribute^.Child.Properties, Tree.Tree);
END;
END;
END;
FOR i := AttrCount + 1 TO InstCount DO
IF LifePtr^ [i].Birth < LifePtr^ [i].Death THEN
WITH Instance^ [i] DO
INCL (Attribute^.Child.Properties, Tree.Tree);
END;
END;
END;
ReleaseArray (LifePtr, LifeSize, TSIZE (tLife));
;
RETURN;
END;
END;
END LifeTime1;
PROCEDURE LifeTime2 (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 144 "" *)
WITH t^.Class DO
(* line 144 "" *)
v := 1;
FOR j := 1 TO InstCount DO
j2 := Instance^ [j].Order;
WITH Instance^ [j2] DO
IF {Left, Inherited, First} <= Properties THEN
v := Attribute^.Child.Partition;
IF v > ChildsVisit THEN RETURN; END;
END;
IF NOT (Dummy IN Properties) AND (ChildsVisit = v) THEN
FOR k := 1 TO ChildsClass^.Class.AttrCount DO
IF IsRelated (j2, k, DP) THEN
LifePtr^ [ActClass^.Class.AttrCount + ActChild^.Child.InstOffset + k].Death := Visit;
END;
END;
END;
END;
END;
;
RETURN;
END;
END;
END LifeTime2;
PROCEDURE LifeTime3 (t: Tree.tTree);
VAR yyTempo: RECORD CASE : INTEGER OF
END; END;
BEGIN
IF t = Tree.NoTree THEN RETURN; END;
IF (t^.Kind = Tree.Class) THEN
(* line 169 "" *)
WITH t^.Class DO
(* line 169 "" *)
ActClass := t;
ForallAttributes (Attributes, LifeTime3);
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Child) THEN
(* line 173 "" *)
WITH t^.Child DO
(* line 173 "" *)
INCL (Properties, Tree.Tree);
IF Input IN Properties THEN
INC (ChildrenIn);
ELSE
INC (ChildrenDyn);
END;
;
RETURN;
END;
END;
IF (t^.Kind = Tree.Attribute) THEN
(* line 181 "" *)
WITH t^.Attribute DO
(* line 181 "" *)
IF IsElement (ORD ('0'), Options) THEN
IF (Input IN Properties) OR (Output IN Properties) THEN
INCL (Properties, Tree.Tree);
IF Input IN Properties THEN
INC (AttributeIn);
ELSE
INC (AttributeOut);
END;
END;
IF NOT (Tree.Tree IN Properties) THEN
INCL (Properties, Parameter);
END;
ELSE
INCL (Properties, Tree.Tree);
END;
IF {Test, Dummy, Virtual, Demand} * Properties # {} THEN
EXCL (Properties, Tree.Tree);
EXCL (Properties, Parameter);
END;
IF IsElement (ORD ('3'), Options) THEN
IF ({Test, Dummy, Virtual, Input, Output} * Properties) = {} THEN
WriteIdent (StdOutput, ActClass^.Class.Name);
WriteS (StdOutput, " = ");
WriteIdent (StdOutput, Name);
WriteS (StdOutput, " ");
IF Tree.Tree IN Properties THEN
WriteS (StdOutput, "Tree" ); INC (AttributeTree);
ELSIF Parameter IN Properties THEN
WriteS (StdOutput, "Parameter" ); INC (AttributeParam);
ELSIF Stack IN Properties THEN
WriteS (StdOutput, "Stack" ); INC (AttributeStack);
ELSIF Variable IN Properties THEN
WriteS (StdOutput, "Variable" ); INC (AttributeVar);
ELSIF Demand IN Properties THEN
WriteS (StdOutput, "Demand" ); INC (AttributeDemand);
END;
WriteNl (StdOutput);
END;
END;
;
RETURN;
END;
END;
END LifeTime3;
PROCEDURE BeginOptimize;
BEGIN
END BeginOptimize;
PROCEDURE CloseOptimize;
BEGIN
END CloseOptimize;
PROCEDURE yyExit;
BEGIN
IO.CloseIO; System.Exit (1);
END yyExit;
BEGIN
yyf := IO.StdOutput;
Exit := yyExit;
BeginOptimize;
END Optimize.